package com.ocean;

import java.net.URI;

import com.ocean.exception.FileException;
import com.ocean.util.LogUtil;

public class FttpMigrantWorker extends MigrantWorker {
	/**
	 * 
	 */
	private static final long serialVersionUID = -6949647388326350716L;
	// fw.waitWorking("fttp", "comuptername");
	static final String FTTPSN = "fttp_";
	static final int FTTPPORT = 2121;

	@Override
	void waitWorkingByService(String host, int port, String workerType)// remove
																		// protected
	{
		this.host = host;
		this.port = port;
		this.workerType = workerType;
		BeanContext.startFttpWorker(host, port, workerType, this);
		ParkPatternExector.createWorkerTypeNode(workerType, host + ":" + port);
	}

	@Override
	public boolean receive(WareHouse inhouse) {
		String fp = inhouse.getString("filepath");
		// System.out.println("fp:"+fp);
		byte[] fbs = (byte[]) inhouse.getObj("filebytes");
		boolean wr = true;
		FileAdapter fa = new FileAdapter(fp);
		try {
			if (fbs == null)
				fa.createFile();
			else
				fa.getWriter().writeSafety(fbs);
		} catch (FileException fe) {
			LogUtil.info("[FttpMigrantWorker]", "[receive]", fe.getMessage());
			wr = false;
		}
		fa.close();

		return wr;
	}

	public boolean copy(String frompath, long every, URI tofttppath) {// every
																		// 8m
		/*
		 * System.out.println("tofttppath:"+tofttppath);
		 * System.out.println("this.host:"+this.host);
		 * System.out.println("this.port:"+this.port);
		 * System.out.println("tofttppath.getHost:"+tofttppath.getHost());
		 * System.out.println("tofttppath.getPort:"+tofttppath.getPort());
		 */
		boolean r = true;
		FileAdapter fa = new FileAdapter(frompath);
		if (this.host.equals(tofttppath.getHost())
				&& this.port == getFttpPort(tofttppath)) {
			if (fa.isDirectory()
					|| fa.length() != fa.copyTo(tofttppath.getPath(), every))
				r = false;
		} else {
			Workman wm = getWorkerElse(FTTPSN, tofttppath.getHost(),
					getFttpPort(tofttppath));
			// just for file
			WareHouse inhouse = new WareHouse("filepath", tofttppath.getPath());
			byte[] bts = null;
			long begin = 0;
			while ((bts = fa.getReader(begin, every).readAll()) != null) {// readAllSafety
				inhouse.setObj("filebytes", bts);
				if (!wm.receive(inhouse)) {
					r = false;
					break;
				}
				begin += bts.length;
			}
			if (begin == 0 && fa.isFile() && r) {
				inhouse.setObj("filebytes", bts);
				r = wm.receive(inhouse);
			}
		}
		fa.close();
		return r;
	}

	@Override
	public WareHouse doTask(WareHouse inhouse) {
		// throws nosuchmethod exception
		return null;
	}

	private int getFttpPort(URI fttppath) {
		return fttppath.getPort() == -1 ? FTTPPORT : fttppath.getPort();
	}

	public static void main(String[] args) {
		FttpMigrantWorker fw = new FttpMigrantWorker();
		// fw.waitWorking("localhost",Integer.parseInt(args[1]),"fttp");
		fw.waitWorking("localhost", 2121, FttpMigrantWorker.FTTPSN);// default
																	// port
	}
}